﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using CondominiosSOAP.Persistencia;
using CondominiosSOAP.Dominio;

namespace CondominiosSOAP
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "Viviendas" en el código, en svc y en el archivo de configuración a la vez.
    public class Viviendas : IViviendas
    {
        private ViviendaDAO viviendaDAO = null;

        private ViviendaDAO ViviendaDAO
        {
            get
            {
                if (viviendaDAO == null)
                    viviendaDAO = new ViviendaDAO();
                return viviendaDAO;
            }
        }

        private ResidenteDAO residenteDAO = null;

        private ResidenteDAO ResidenteDAO
        {
            get
            {
                if (residenteDAO == null)
                    residenteDAO = new ResidenteDAO();
                return residenteDAO;
            }
        }
        

        public SVivienda CrearVivienda(SVivienda dvivienda)
        {
            // Validación de existencia de una vivienda
            if (ViviendaDAO.Obtener(dvivienda.NumVivienda) != null)
                throw new Exception("Ya existe la Vivienda");

            // Validación de existencia del residente
            //SResidente residente = ResidenteDAO.Obtener(dvivienda.Residente.DNI);
            SResidente residenteExistente = ResidenteDAO.Obtener(dvivienda.Residente.DNI);
            if (residenteExistente == null)
                throw new Exception("Residente inexistente");

            if (null == dvivienda.Tipo || String.Empty.Equals(dvivienda.Tipo))
                throw new Exception("No se puede registrar un residente sin el Tipo");

            if (ViviendaDAO.obtenerViviendaPorResidente(residenteExistente.DNI).Count > 0)
                throw new Exception("El residente ingresado ya tiene vivienda registrada");

            //SResidente residenteExistente = ResidenteDAO.Obtener(dvivienda.Residente.DNI);

            SVivienda viviendaACrear = new SVivienda();

            viviendaACrear.NumVivienda = dvivienda.NumVivienda;
            viviendaACrear.Ubicacion = dvivienda.Ubicacion;
            viviendaACrear.Numero = dvivienda.Numero;
            viviendaACrear.Metraje = dvivienda.Metraje;
            viviendaACrear.Tipo = dvivienda.Tipo;
            viviendaACrear.Residente = residenteExistente;

            return ViviendaDAO.Crear(viviendaACrear);
        }

        public SVivienda ObtenerVivienda(Int32 numVivienda)
        {
            return ViviendaDAO.Obtener(numVivienda);
        }

        public SVivienda ModificarVivienda(SVivienda dvivienda)
        {
            SResidente residenteExistente = ResidenteDAO.Obtener(dvivienda.Residente.DNI);

            SVivienda viviendaAModificar = new SVivienda();

            viviendaAModificar.NumVivienda = dvivienda.NumVivienda;
            viviendaAModificar.Ubicacion = dvivienda.Ubicacion;
            viviendaAModificar.Numero = dvivienda.Numero;
            viviendaAModificar.Metraje = dvivienda.Metraje;
            viviendaAModificar.Tipo = dvivienda.Tipo;
            viviendaAModificar.Residente = residenteExistente;

            return ViviendaDAO.Modificar(viviendaAModificar);
        }

        public void EliminarVivienda(SVivienda dvivienda)
        {
            SVivienda viviendaExistente = ViviendaDAO.Obtener(dvivienda.NumVivienda);
            ViviendaDAO.Eliminar(viviendaExistente);
        }

        public ICollection<SVivienda> ListarTodosLasViviendas()
        {
            return ViviendaDAO.ListarTodos();
        }
    }
}
